home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
cdda.s
< prev
next >
Wrap
Text File
|
1999-12-19
|
8KB
|
384 lines
.include global.mac
.include preconv.mac
;----------------------------------------------------------------
;CDDA(Compact Disc Digital Audio)
;----------------------------------------------------------------
;CDDAをオープンする
;<current_param_ptr.l:パラメータバッファのアドレス
;>next_param_ptr.l:次のパラメータバッファのアドレス
;>d0.l:負数=エラー,0=データなし正常終了,その他=データあり
;>n-flag:mi=エラー
;>z-flag:eq=データなし正常終了
.text
.align 4,$2048
open_cdda::
movem.l d1-d3/d7/a0,-(sp)
bsr init_scsiid
bmi 99f
bsr init_cdrom
bmi 99f
move.w #SS16L,data_format ;データのフォーマット
move.l #44100,data_frequency ;データのサンプリング周波数
movea.l current_param_ptr,a2
move.l (pb_trktop,a2),d2 ;開始トラック番号
cmp.l cdda_mintrk,d2
bgt @f
move.l cdda_mintrk,d2
move.l d2,(pb_trktop,a2)
@@:
move.l (pb_trkbtm,a2),d3 ;終了トラック番号
cmp.l cdda_maxtrk,d3
blt @f
move.l cdda_maxtrk,d3
move.l d3,(pb_trkbtm,a2)
@@:
cmp.l d2,d3
blt 80f ;n1>n2
beq 1f
addq.l #1,(pb_trktop,a2)
move.l a2,next_param_ptr
bra 2f
1: lea.l (pb_size,a2),a0
move.l a0,next_param_ptr
2:
cmp.l cdda_mintrk,d2
blo 81f
cmp.l cdda_maxtrk,d3
bhi 81f
1: move.l d2,d0
bsr cdda_getfrm
bmi 82f
tst.b d1
beq 2f
tst.b silent_flag
bne @f
lea.l (m_open_skip_1,pc),a0
bsr eprint
move.l d2,d0
bsr utos_eprint
lea.l (m_open_skip_2,pc),a0
bsr eprintcrlf
@@:
addq.b #1,d2
cmp.b d2,d3
bhs 1b
;データトラックで終わり
tst.b (pb_done,a2)
beq 90f
sf.b (pb_done,a2)
bra 98f ;正常終了
2: move.l d0,cdda_stafrm ;演奏開始フレーム番号
move.l d0,cdda_curfrm ;現在のフレーム番号
cmp.b d2,d3
beq 1f ;今回のトラックで終わり
move.b d2,d3
move.l d2,d0
addq.b #1,d0 ;次のトラックも再生する
move.l d0,(pb_trktop,a2)
movea.l a2,a0
bra 2f
1: sf.b (pb_done,a2)
lea.l (pb_size,a2),a0
2: move.l a0,next_param_ptr
;<d2.l:開始トラック
;<d3.l:終了トラック
;現在d2=d3のみだが,これ以降はd2<d3でも動作する
move.l cdda_maxfrm,d0 ;最後のトラックまでのときは最後のフレームまで
cmp.l cdda_maxtrk,d3
beq 2f
move.l d3,d0
addq.b #1,d0 ;終了トラックの次のトラック
bsr cdda_getfrm
bmi 82f
2: move.l d0,cdda_endfrm ;演奏終了フレーム番号
tst.b silent_flag
bne 1f
lea.l (m_open_cdda_track1,pc),a0
bsr eprint
move.l d2,d0
bsr utos_eprint
.if 0
cmp.l d2,d3
beq @f
lea.l (m_open_cdda_track2,pc),a0
bsr eprint
move.l d3,d0
bsr utos_eprint
@@:
.endif
1:
tst.b silent_flag
bne 1f
lea.l (-256,sp),sp
movea.l sp,a0
move.b #' ',(a0)+
move.l d2,d0
bsr get_track_name
beq @f
movea.l sp,a0
bsr eprint
@@: lea.l (256,sp),sp
1:
tst.b silent_flag
bne 1f
lea.l (m_open_cdda_track3,pc),a0
tst.b conv_flag
beq @f
lea.l (m_open_cdda_track4,pc),a0
@@: bsr eprintcrlf
1:
moveq.l #1,d0 ;データあり
bra 99f
98: moveq.l #0,d0 ;データなし正常終了
99: movem.l (sp)+,d1-d3/d7/a0
rts
80: move.w #EXIT_ILLEGAL_TRACK,exit_code
lea.l (m_illegal_track,pc),a0
bra 89f
81: move.w #EXIT_OUTSIDE_TRACK,exit_code
lea.l (m_outside_track,pc),a0
bra 89f
82: move.w #EXIT_TRACK_INF_ERROR,exit_code
lea.l (m_cdda_open_error,pc),a0
89: bsr eaprintcrlf
90: moveq.l #-1,d0
bra 99b
m_open_cdda_track1: .dc.b 'トラック ',0
.if 0
m_open_cdda_track2: .dc.b '~',0
.endif
m_open_cdda_track3: .dc.b ' を再生します',0
m_open_cdda_track4: .dc.b ' を変換します',0
m_open_skip_1: .dc.b 'トラック ',0
m_open_skip_2: .dc.b ' はデータトラックです',0
m_illegal_track: .dc.b 'トラック番号の指定が異常です',0
m_outside_track: .dc.b 'トラック番号が範囲外です',0
m_cdda_open_error: .dc.b '指定されたトラックの情報の取得に失敗しました',0
.even
.bss
.align 4
cdda_stafrm: .ds.l 1 ;演奏開始フレーム番号
cdda_endfrm: .ds.l 1 ;演奏終了フレーム番号
cdda_curfrm: .ds.l 1 ;現在のフレーム番号
;----------------------------------------------------------------
;トラック番号から開始フレーム番号を得る
;<d0.b:トラック番号
;>d0.l:開始フレーム番号(0~)
;>d1.b:0=音声トラック,4=データトラック,-1=エラー
;>z-flag:mi=エラー
.text
.align 4,$2048
cdda_getfrm:
bsr cdda_gettim
bmi @f
bsr msf2frm
tst.l d0
@@: rts
;----------------------------------------------------------------
;トラック番号から開始フレーム番号(MSF形式)を得る
;<d0.b:トラック番号
;>d0.l:開始位置(mm:ss:ff,2秒~),-1=エラー
;>d1.b:0=音声トラック,4=データトラック
;>z-flag:mi=エラー
.text
.align 4,$2048
cdda_gettim:
lea.l (-256,sp),sp
move.b d0,cmd_readtoc+6
move.l sp,-(sp)
pea.l 12.w
pea.l cmd_readtoc
pea.l 10.w
bsr scsicmd
lea.l (16,sp),sp
bmi 80f
moveq.l #$04,d1
and.b (5,sp),d1
move.l (8,sp),d0
and.l #$00FFFFFF,d0
99: lea.l (256,sp),sp
rts
80: bsr print_scsicmd_error
moveq.l #-1,d0
bra 99b
;----------------------------------------------------------------
;CDDAから読み込む
;<a0.l:出力バッファの先頭
;<a1.l:入力バッファの先頭
;>d0.l:データのサイズ,-1=エラー
.text
.align 4,$2048
read_cdda::
movem.l d1-d7/a0-a6,-(sp)
move.l a0,d7 ;バッファのアドレス
movea.l a1,a6 ;開始アドレス
movea.l a1,a2 ;開始アドレス
.if TEST_68000=0
IS68000 d0
bne @f
.endif
addq.l #1,a2 ;68000でlittle-endian
@@:
movea.l cdda_curfrm,a4 ;開始フレーム番号
movea.l cdda_endfrm,a5
suba.l a4,a5 ;転送フレーム数
move.l a5,d0
beq 99f ;0なら終了
move.l buffrm,d5 ;バッファのフレーム数
move.b read_shift_count,d1
lsr.l d1,d5
cmp.l d5,a5
bls @f
move.l d5,a5
@@:
10: move.l stpfrm,d5 ;今回の転送フレーム数
cmp.l a5,d5
bls @f
move.l a5,d5
@@:
move.w d5,d3
mulu.w #BUFFRM_UNIT,d3 ;今回の転送バイト数
;buffrmは65535までなのでmulu.wで十分
move.l a4,d0 ;開始フレーム番号
move.l d5,d1 ;転送フレーム数
movea.l a2,a0 ;バッファ
bsr read_cdrom_audio_2352
bpl 1f
tst.b force_flag
beq 80f
cmpi.b #-1,scsicmd_error_call
bne 80f
cmpi.b #$02,scsicmd_error_sts
bne 80f
cmpi.b #$3,scsicmd_error_sns
bne 80f
moveq.l #'!',d0 ;Medium Errorのとき
bsr silent_eputchar
addq.l #1,a4 ;1フレームだけ進む
subq.l #1,a5
bra 11f
1:
adda.l d5,a4 ;次回のフレーム番号
suba.l d5,a5 ;残りフレーム数
adda.l d3,a2 ;次回のアドレス
.if CURRENT_TIME=0
moveq.l #'.',d0
bsr silent_eputchar
.endif
11:
tst.b esc_aborted
bne 90f
move.l a5,d0 ;残りフレーム数
bne 10b
move.l a4,cdda_curfrm ;次回の開始フレーム番号
;68000のとき必要ならばmovepを使ったエンディアン変換を行う
.if TEST_68000=0
IS68000 d0
bne @f
.endif
subq.l #1,a2 ;68000でlittle-endian
move.l a2,d0
sub.l a6,d0
movea.l a6,a0
bsr convert_endian_68000
@@:
movea.l d7,a0 ;出力バッファの先頭
movea.l a6,a1 ;入力データの先頭
* movea.l a2,a2 ;入力データの末尾+1
move.l a0,-(sp)
movea.l preconv_routine,a6 ;PCMデータをOPMのTLの並びに変換する
jsr (a6)
movea.l (sp)+,a1 ;出力データの先頭
move.l a0,d0 ;出力データの末尾
sub.l a1,d0 ;出力データの長さ
beq 99f
tas.b (-1,a0) ;エンドコードを付加する
smi.b d1
neg.b d1
sf.b (a0)
move.b d1,(1,a0) ;0,1(末尾のデータのbit7の値)
move.l a1,nxttop
tst.l d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
80: bsr ecrlf
bsr print_scsicmd_error
move.w #EXIT_READ_CDDA_ERROR,exit_code
lea.l (m_read_cdda_error,pc),a0
bsr eprintcrlf
90: moveq.l #-1,d0
bra 99b
m_read_cdda_error: .dc.b 13,10
.dc.b '読み込みエラー',0
;----------------------------------------------------------------
;CDDAをクローズする
.text
.align 4,$2048
close_cdda::
bsr tini_cdrom
moveq.l #0,d0
rts
;----------------------------------------------------------------
;入力データの残りバイト数を得る
;>d0.l:データの残りバイト数
.text
.align 4,$2048
get_restsize_cdda::
move.l cdda_endfrm,d0
sub.l cdda_curfrm,d0
mulu.w #BUFFRM_UNIT,d0
rts